package com.wlc.fanxing;

import com.wlc.collection.Hero;
import com.wlc.fanxing.abc.Man;
import com.wlc.fanxing.abc.People;
import com.wlc.fanxing.abc.Woman;
import com.wlc.oop.demo08.Item;
import com.wlc.oop.demo08.interface1.APHero;

import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;

/**
 * @author 王立朝 wanglichao@champion-credit.com
 * @description
 * @date 2021-07-13 15:47
 */
public class MyStack<T> {

    LinkedList<T> linkedList = new LinkedList<>();

    /**
     * 添加到最后
     *
     * @param h
     */
    public void push(T h) {
        linkedList.addLast(h);
    }

    /**
     * 把链表的最后一个元素移除
     *
     * @return
     */
    public T pull() {
        return linkedList.removeLast();
    }

    public void method01() {
        // 英雄HeroStack
        MyStack<Hero> heroMyStack = new MyStack<>();
        heroMyStack.push(new Hero("zhangsan111"));
        heroMyStack.push(new Hero("zhangsan222"));
        // 放不进去
        // heroMyStack.push(new Item("hello"));
        MyStack<Item> itemMyStack = new MyStack<>();
        itemMyStack.push(new Item("item1"));
        itemMyStack.push(new Item("item2"));
        // 放不进去
        // itemMyStack.push(new Hero(""));
    }

    public void method02() {
        ArrayList<Woman> plist = new ArrayList<>();
        plist.add(new Woman("woman"));

        ArrayList<Man> mlist = new ArrayList<>();
        mlist.add(new Man("man"));

        ArrayList<? extends People> wlistx = new ArrayList<>();
        ArrayList<? extends People> wlist = plist;
        // 取出来一定可以转换成 People 人类
        People people = wlist.get(0);
        System.out.println("people = " + people);

        ArrayList<? extends People> wlist2 = mlist;
        // 取出来一定可以转换成 People 人类或者 人类的子类
        Man man = (Man) wlist2.get(0);
        System.out.println("man = " + man);
        //wlist.add(new Woman());
        // wlist.add(new Man());

    }

    public void method03() {
        // 表示 arrayList 是 People 的 范型或者 People 的 父类
        ArrayList<? super People> arrayList = new ArrayList<>();
        // 可以添加 Peopel ，子类 ，以及父类
        arrayList.add(new People());
        arrayList.add(new Man("asdf"));
        arrayList.add(new Woman());
        // 不可以直接取出来，因为有可能是父类，有可能是子类，还有可能是Object 类
        //People people = arrayList.get(0);
    }

    public void method04() {
        ArrayList<? super People> heroList = new ArrayList<Object>();

        //? super Hero 表示 heroList的泛型是Hero或者其父类泛型

        //heroList 的泛型可以是Hero
        //heroList 的泛型可以是Object

        //所以就可以插入Hero
        heroList.add(new People());
        //也可以插入Hero的子类
        heroList.add(new Man());
        heroList.add(new Woman());

        //但是，不能从里面取数据出来,因为其泛型可能是Object,而Object是强转Hero会失败
        //People people = heroList.get(0);
    }
    public void method05(){
        ArrayList<?> arrayList = new ArrayList<>();
        Object o = arrayList.get(0);
        //  不可以放入任何内容
        //arrayList.add(new Man());
        //arrayList.add(new Object());
    }

    public static void main(String[] args) {
        new MyStack<>().method03();
    }
}
